/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ CatalogService.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: Camilo Alvarez
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.servicios;

import com.losalpes.catalogo.entities.Mueble;
import com.losalpes.catalogo.excepciones.InvalidDataException;
import com.losalpes.catalogo.excepciones.InvalidOperationException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;

/**
 * Implementacion de los servicios del catalogo que se le prestan al sistema. [Mock Object]
 * @author Camilo Alvarez
 */
@Stateful
public class CatalogService implements ICatalogServiceLocal,ICatalogServiceRemote {

    // --------------------------------------------
    // Atributos
    // --------------------------------------------

    /**
     * Mueble que està siendo editado por la aplicación
     */
    private Mueble cMueble;

    /**
     * Unidad de persistencia de la aplicacion
     */
    @EJB
    private IPersistenceServices persistenceServices;

    // --------------------------------------------
    // Constructor
    // --------------------------------------------

    /**
     * Crea una nueva instancia de Vendedor y la retorna.
     * @return vendedor. Nueva instancia de vendedor.
     */
    public Mueble newMueble() {
        
        cMueble = new Mueble();
        return cMueble;
    }

    /**
     * Modifica un vendedor dentro de la persistencia del sistema.
     * @return vendedor. Objeto modificado de la instancia de vendedor que se modifico.
     */
    public Mueble createOrUpdate()throws InvalidDataException{
        if(cMueble.getAlto()<=0){
            throw new InvalidDataException("La altura debe ser un nÃºmero positivo");
        }
        if(cMueble.getAncho()<=0){
            throw new InvalidDataException("El ancho debe ser un nÃºmero positivo");
        }
        if(cMueble.getCantidad()<0){
            throw new InvalidDataException("La cantidad debe ser un nÃºmero positivo o cero");
        }
        if(cMueble.getProfundidad()<=0){
            throw new InvalidDataException("La profundidad debe ser un nÃºmero positivo");
        }
        if(cMueble.getPrecio()<0){
            throw new InvalidDataException("El precio debe ser un nÃºmero positivo");
        }
        if(cMueble.getPeso()<0){
            throw new InvalidDataException("El peso debe ser un nÃºmero positivo");
        }
        if(cMueble.getNombre()==null||cMueble.getNombre().isEmpty()){
            throw new InvalidDataException("Debe ingresar un nombre no vacÃ­o");
        }
        if (cMueble.getReferencia() == null) {
            try {
                persistenceServices.create(cMueble);
            } catch (InvalidOperationException ex) {
            }
        } else {
            persistenceServices.update(cMueble);
        }
        return cMueble;
    }

	/**
     * Retorna la lista de todos los vendedores registrados en el sistema.
     * @return list. Lista de todos los vendedores registrados en el sistema.
     */
    public List<Mueble> findAll() {
        return persistenceServices.findAll(Mueble.class);
    }

    /**
     * Retorna un vendedor dada su identificación.
     * @param id. Identificador único del vendedor.
     * @return vendedor. Vendedor cuyo identificador corresponde con el parametro.
     */
    public Mueble findByIdentificacion(Long id) {
        return (Mueble)persistenceServices.findById(Mueble.class,id);
    }

    /**
     * Permite eliminar un vendedor de la persistencia del sistema.
     */
    @Remove
    public void delete() {
        try {
            persistenceServices.delete(cMueble);
        } catch (InvalidOperationException ex) {
            Logger.getLogger(CatalogService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Retorna el vendedor actual.
     * @return vendedor. Vendedor actual.
     */
    public Mueble getMueble() {
        return cMueble;
    }

    /**
     * Permite asignar el vendedor actual.
     * @param id. Identificador de nuevo cendedor actual.
     * @return vendedor. Nuevo vendedor actual.
     */
    public void setMueble(Mueble mueble) {
        cMueble=mueble;
    }

}